[[tags: manual]]

== Confirmed deviations

Identifiers are by default case-sensitive (see [[Using the compiler]]).

=== Number of arguments to procedures and macros

The maximal number of arguments that may be passed to a
compiled procedure or macro is 120. (However, a macro-definition
that has a single rest-parameter can have any number of arguments.)
Likewise, the maximum number of values that can be passed
to continuations captured using {{call-with-current-continuation}}
is 120.  This is an implementation restriction that is unlikely
to be lifted.


=== {{numerator}}, {{denominator}} and {{rationalize}}

The {{numerator}} and {{denominator}} procedures cannot be
applied to inexact numbers, and the procedure {{rationalize}} is not
implemented at all.


=== Numeric string-conversion considerations

The runtime system uses the numerical string-conversion
routines of the underlying C library and so does only understand
standard (C-library) syntax for floating-point constants.  Consequently,
the procedures {{string->number}}, {{read}}, {{write}}, and {{display}} do not obey
read/write invariance to inexact numbers.


=== Environments and non-standard syntax

Code evaluated in {{scheme-report-environment}} or
{{null-environment}} still sees non-standard syntax.


== Unconfirmed deviations

=== {{char-ready?}}

The procedure {{char-ready?}} always returns {{#t}} for
terminal ports.



== Doubtful deviations

=== {{letrec}}

{{letrec}} does evaluate the initial values for the bound
variables sequentially and not in parallel, that is:

<enscript highlight="scheme">
(letrec ((x 1) (y 2)) (cons x y))
</enscript>

is equivalent to

<enscript highlight="scheme">
(let ((x (void)) (y (void)))
  (set! x 1)
  (set! y 2)
  (cons x y) )
</enscript>

where R5RS requires

<enscript highlight="scheme">
(let ((x (void)) (y (void)))
  (let ((tmp1 1) (tmp2 2))
    (set! x tmp1)
    (set! y tmp2)
    (cons x y) ) )
</enscript>

It is unclear whether R5RS permits this behavior or not; in any case,
this only affects letrecs where the bound values are not
lambda-expressions.


== Non-deviations that might surprise you

=== {{let-syntax}} and {{letrec-syntax}}

{{let-syntax}} and {{letrec-syntax}} introduce a new scope.


=== {{equal?}} compares all structured data recursively

{{equal?}} compares all structured data recursively, while R5RS
specifies that {{eqv?}} is used for data other than pairs, strings and
vectors.  However, R5RS does not dictate the treatment of data types
that are not specified by R5RS.


=== No built-in support for bignums

There is no built-in support for exact rationals, complex
numbers or extended-precision integers (bignums). The routines
{{complex?}}, {{real?}} and {{rational?}} are identical to
the standard procedure {{number?}}. The procedures {{make-rectangular}}
and {{make-polar}} are not implemented. Fixnums are limited to
2^<nowiki><sup>30</sup></nowiki> (or 2^<nowiki><sup>62</sup></nowiki>
on 64-bit hardware).  Support for the full numeric tower is available
as a separate package, provided the GNU multiprecision library is installed.


=== {{transcript-on}} and {{transcript-off}} are not implemented

The {{transcript-on}} and {{transcript-off}} procedures are
not implemented.  R5RS does not require them.

---
Previous: [[The R5RS standard]]

Next: [[Extensions to the standard]]
